import alsaaudio, sys
#ALSA is default
class VolumeControllers():
    '''
    Hierin wordt de volume gecontroleerd. Het is aangeraden indien je je eigen controller wilt schrijven dat je gewoon overerft van VolumeControllers() zelf zodat je zeker de nodige functies implementeert. De standaard volume-controller maakt gebruikt van alsaaudio.
    '''
    def __init__(self):
        '''
        Zal de audio-mixer initialiseren of een error wegschrijven dat alsa-audio niet aangesproken kan worden.
        '''
        self.mixerID = 0    #Default mixer
        try:
            self.mixer = alsaaudio.Mixer()
        except alsaaudio.ALSAAudioError:
            sys.stderr.write("At the moment we only support ALSA Audio")
            sys.exit(1)
        self.channel = 'Master'

    def currentVolumelevel(self):
        '''
        Geeft een float terug van wat het huidige volume-level is op het systeem.
        '''
        return self.mixer.getvolume()[0]
    
    def volumeSet(self,points):
        '''
        Zal het volume-level instellen naar het meegegeven getal. Dit getal moet tussen 0 en 100 zitten. Geeft een 1 terug bij succes en -1 bij een error
        '''
        if(int(points) > 100 or int(points) < 0):
            print "Value is not allowed, must be between 0 and 100"
            return -1
        else:
            self.mixer.setvolume(int(points))
            return 1

    def volumeUp(self,points):
        '''
        Zal het volume-level laten stijgen met het meegegeven getal.  Bij succes zal je het huidige volume-level terug krijgen, anders geeft hij -1 terug
        '''
        if int(self.mixer.getvolume()[0])+points <= 100 + points:
            self.mixer.setvolume(min(int(self.mixer.getvolume()[0])+points,100))
            return self.mixer.getvolume()[0]
        else:
            return -1       
 
   
    def volumeDown(self,points):
        '''
        Zal het volume-level laten dalen met het meegegeven getal.  Bij succes zal je het huidige volume-level terug krijgen, anders geeft hij -1 terug.
        '''
        if int(self.mixer.getvolume()[0])-points >= 0:
            self.mixer.setvolume(int(self.mixer.getvolume()[0])-points)
            return self.mixer.getvolume()[0]
        else:
            return -1

    def setMixer(self,mixerID = 0):
        '''
        Indien de standaard mixer fout is kan je deze wijzigen met deze functie, indien je een foute mixer meegeeft zal hij een error teruggeven.
        '''
        try:
            self.mixer = alsaaudio.Mixer(name, cardindex=mixerID)
            return 1
        except alsaaudio.ALSAAudioError:
            sys.stderr.write("No such mixer")
            sys.exit(1)

    def setName(self,name = 'Master'):
        '''
        Als de standaard kanaal fout is (Master,PCM,\ldots) dan kan je met deze functie die wijzigen. Indien het kanaal niet bestaat krijg je een error.
        '''
        try:
            self.mixer = alsaaudio.Mixer(name, cardindex=self.mixerID)
            return 1
        except alsaaudio.ALSAAudioError:
            sys.stderr.write("No such mixer")
            sys.exit(1)
       
    def volumeOff(self):
        '''
        Deze functie zal alle kanalen muten.
        '''
        try:
            self.mixer.setmute(1,alsaaudio.MIXER_CHANNEL_ALL)
            return 1
        except alsaaudio.ALSAAudioError:
            print "Couldn't mute the sound"
            return -1
         
    def volumeOn(self):
        '''
        Deze functie zal alle kanalen unmuten.
        '''
        try:
            self.mixer.setmute(0,alsaaudio.MIXER_CHANNEL_ALL)
            return 1
        except alsaaudio.ALSAAudioError:
            print "Couldn't unmute the sound"
            return -1